/***************************************************
> Copyright (C) 2024 ==KINGYI== All rights reserved.
> File Name: pm2.c
> Author: KAIJIE.JIANG
> Mail: 
> Created Time: 2024年10月15日 星期二 15时15分50秒
***************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*
4. 解析JSON数据包。
如下为一个JSON字符串，"{"usr":"qwzl","passwd":"123456","state":1}",
试从中解析出用户名,密码和状态值。
*/

typedef struct{
	char usr[10];			//用户名
	char passwd[20];		//密码
	int state;				//状态
}JSON_Struct;

/*
 * 功能：JSON字符串中解析出字符串
 * 参数：json原串，键，存放值的空间
 * 返回值：成功返回0，失败返回-1
 * */
int json_analy_string(const char *json, const char *key, char *dest);
/*
 * 功能：JSON字符串中解析出整型数字
 * 参数：json原串，键，存放值的空间
 * 返回值：成功返回0，失败返回-1
 * */
int json_analy_int(const char *json, const char *key, int *number);
/*
 * 功能：JSON字符串中解析出浮点型数字
 * 参数：json原串，键，存放值的空间
 * 返回值：成功返回0，失败返回-1
 * */
int json_analy_float(const char *json, const char *key, float *number);

int main(int argc,const char* argv[])
{
	int ret = 0;
	char json[100] = {"{\"usr\":\"qwzl\",\"passwd\":\"123456\",\"state\":1}"};
	JSON_Struct json_res;

	memset(&json_res, 0, sizeof(JSON_Struct));

	ret = json_analy_string(json, "usr", json_res.usr);
	if(ret == 0){
		printf("usr:%s\n", json_res.usr);
	}else if(ret == -1){
		printf("json analy fail\n");
	}

	ret = json_analy_string(json, "passwd", json_res.passwd);
	if(ret == 0){
		printf("passwd:%s\n", json_res.passwd);
	}else if(ret == -1){
		printf("json analy fail\n");
	}

	ret = json_analy_int(json, "state", &json_res.state);
	if(ret == 0){
		printf("state:%d\n", json_res.state);
	}else if(ret == -1){
		printf("json analy fail\n");
	}

	return 0;
}

int json_analy_string(const char *json, const char *key, char *dest){
	char *start = NULL;
	char *end = NULL;

	start = strstr(json, key);			//在json串内查找键
	if(start == NULL)return -1;			//未找到返回-1
	start = start + strlen(key) + 3;	//将指针移动到值开始

	end = strchr(start, ',');			//在json串内查找值结束
	if(end == NULL){					//未找到，有可能是最后一对键值对
		end = strchr(start, '}');		//查找}
		if(end == NULL)return -1;		//未找到返回-1
	}

	end = end - 1;						//将指针移动到值末尾

	strncpy(dest, start, end - start);	//将值拷贝到结果存储空间

	return 0;
}

int json_analy_int(const char *json, const char *key, int *number){
	char *start = NULL;
	char *end = NULL;
	char temp[10] = {0};

	start = strstr(json, key);			//在json串内查找键
	if(start == NULL)return -1;			//未找到返回-1
	start = start + strlen(key) + 2;	//将指针移动到值开始

	end = strchr(start, ',');			//在json串内查找值结束
	if(end == NULL){					//未找到，有可能是最后一对键值对
		end = strchr(start, '}');		//查找}
		if(end == NULL)return -1;		//未找到返回-1
	}

	strncpy(temp, start, end - start);	//将值拷贝到临时存储空间

	*number = atoi(temp);				//将值转为整型输出

	return 0;
}

int json_analy_float(const char *json, const char *key, float *number){
	char *start = NULL;
	char *end = NULL;
	char temp[10] = {0};

	start = strstr(json, key);			//在json串内查找键
	if(start == NULL)return -1;			//未找到返回-1
	start = start + strlen(key) + 2;	//将指针移动到值开始

	end = strchr(start, ',');			//在json串内查找值结束
	if(end == NULL){					//未找到，有可能是最后一对键值对
		end = strchr(start, '}');		//查找}
		if(end == NULL)return -1;		//未找到返回-1
	}

	strncpy(temp, start, end - start);	//将值拷贝到临时存储空间

	*number = strtof(temp, NULL);		//将值转为浮点型输出

	return 0;

}
